﻿Imports Microsoft.DirectX
''' <summary>
''' Dieses Objekt zeichnet den Spielverlauf auf.
''' </summary>
''' <remarks></remarks>
Public Class ObjektAufzeichnungen
    Implements ICloneable
    Const Version As Byte = 0
    Public Enum Rang
        S
        A
        B
        C
        D
    End Enum
    Public Aufzeichnungen As TagAufzeichnung() = {}
    Public BesondereEreignisse() As BesonderesEreigniss = {}
    Public DestroyedUnits() As UInt64
    Public LostUnits() As UInt64
    Public Damage() As UInt64
    Public AttackNumbers() As UInt64
    Public DeployedUnits() As UInt64

    Public Sub New(ByVal StartSpieler As Integer)
        Array.Resize(Aufzeichnungen, 1)
        Aufzeichnungen(0) = New TagAufzeichnung()
        If Objektverwalter.Spielfeld IsNot Nothing Then
            ReDim DestroyedUnits(Objektverwalter.Spielfeld.Spieler.Length - 2)
            ReDim LostUnits(Objektverwalter.Spielfeld.Spieler.Length - 2)
            ReDim Damage(Objektverwalter.Spielfeld.Spieler.Length - 2)
            ReDim AttackNumbers(Objektverwalter.Spielfeld.Spieler.Length - 2)
            ReDim DeployedUnits(Objektverwalter.Spielfeld.Spieler.Length - 2)
        End If
    End Sub
    ''' <summary>
    ''' Macht ein Update der Aufzeichnungen, wird immer am RundenAnfang und Runden Ende ausgefuehrt.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub UpdateAufzeichnungen(ByVal RundenAnfang As Boolean, Optional ByVal SpielEnde As Boolean = False)
        If Aufzeichnungen(Aufzeichnungen.Length - 1).UpdateAufzeichnungen(RundenAnfang) Then
            If SpielEnde = False Then
                Array.Resize(Aufzeichnungen, Aufzeichnungen.Length + 1)
                Aufzeichnungen(Aufzeichnungen.Length - 1) = New TagAufzeichnung()
            Else
            End If
        End If
    End Sub
    Public Sub AddEreignis(ByVal Spieler As Integer, ByVal Tag As Integer, ByVal E As BesonderesEreigniss.Ereignisse)
        Array.Resize(BesondereEreignisse, BesondereEreignisse.Length + 1)
        BesondereEreignisse(BesondereEreignisse.Length - 1) = New BesonderesEreigniss(Spieler, Tag, E)
    End Sub
    ''' <summary>
    ''' Berechnet den Rang dieses Spielers
    ''' </summary>
    ''' <param name="Spielfeld"></param>
    ''' <param name="Spieler"></param>
    ''' <param name="PunkteVerteilung">X=Speed, Y=Power, Z=Technique</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CalculateRang(ByVal Spielfeld As ObjektSpielfeld, ByVal Spieler As Integer, ByRef PunkteVerteilung As Vector3) As Rang

        Dim SiegerTeam As Char = "q"
        If Objektverwalter.Spielfeld.Regeln.Spielende = True Then

            For I = 1 To Objektverwalter.Spielfeld.Regeln.Besiegt.Length - 1
                If Objektverwalter.Spielfeld.Regeln.Besiegt(I) = False Then
                    SiegerTeam = Objektverwalter.Spielfeld.Spieler(I).Team
                End If
            Next
        End If
        Dim Punkte As Integer = 0
        Dim MapSize As Integer = Spielfeld.GetSpielgroesse
        'Zeit 
        Dim MTime As Integer = 0
        If Spielfeld.Regeln.MaxTime <= 0 Then
            MTime = (Spielfeld.Hoehe + Spielfeld.Breite) / 5 * 2
        Else
            MTime = Spielfeld.Regeln.MaxTime
        End If
        If Spielfeld.Runde < MTime Then
            PunkteVerteilung.X = 200 - (Spielfeld.Runde * (100 / MTime))
        Else
            PunkteVerteilung.X = 100 - ((Spielfeld.Runde - MTime) * (100 / (3 * MTime)))
        End If
        If PunkteVerteilung.X < 0 Then PunkteVerteilung.X = 0
        If Spielfeld.Spieler(Spieler).Team <> SiegerTeam And Not SiegerTeam = "q" Then
            Dim LostDay As Integer = 0
            For I = 0 To Aufzeichnungen.Count - 1
                If Aufzeichnungen(I).SpielerAufzeichnungen(Spieler - 1, 0) Is Nothing Then
                    LostDay = I
                    Exit For
                Else
                    If Aufzeichnungen(I).SpielerAufzeichnungen(Spieler - 1, 0).Basen < 0 Then
                        If I - 1 >= 0 Then
                            If Aufzeichnungen(I - 1).SpielerAufzeichnungen(Spieler - 1, 0).Basen > 0 Then
                                LostDay = I
                                Exit For
                            End If
                        Else
                            LostDay = 0
                            Exit For
                        End If
                    ElseIf I = Aufzeichnungen.Count - 1 Then
                        LostDay = Spielfeld.Runde
                    End If
                End If
            Next
            PunkteVerteilung.X *= (0.8) * LostDay / Spielfeld.Runde
        End If
        'Kraft
        Dim P1 As Integer = (Damage(Spieler - 1) + (DestroyedUnits(Spieler - 1) * 140))
        If AttackNumbers(Spieler - 1) > 0 Then
            P1 /= AttackNumbers(Spieler - 1)
        Else
            P1 = 0
        End If
        If P1 >= 100 Then
            PunkteVerteilung.Y += P1
        ElseIf P1 > 50 Then
            PunkteVerteilung.Y += (2 * P1) - 100
        Else
            PunkteVerteilung.Y += P1
        End If
        If PunkteVerteilung.Y < 0 Then PunkteVerteilung.Y = 0
        'Technik
        Dim Truppenlimit As Integer = 0
        If Spielfeld.Regeln.MaxDeployedUnits <= 0 Then
            Truppenlimit = Math.DivRem(MapSize, 9, 0)
        Else
            Truppenlimit = Spielfeld.Regeln.MaxDeployedUnits
        End If
        'New Techscore calculation
        Dim TechScore1 As Single = 0
        Dim TechScore2 As Single = 0
        Dim TechScore3 As Single = 0
        If LostUnits(Spieler - 1) > 0 Then 'First the more Units you destroy while loosing less Units
            TechScore1 = (DestroyedUnits(Spieler - 1) / LostUnits(Spieler - 1)) * 1 / 2
        Else
            TechScore1 = 1.3
        End If
        If TechScore1 > 1.3 Then TechScore1 = 1.3 'Just to take it lower.
        Dim Deployed As Integer = DeployedUnits(Spieler - 1) 'You can loose 10% of your Army and still get a good Technique Score
        If Aufzeichnungen(0).SpielerAufzeichnungen(Spieler - 1, 0).Einheiten > 0 Then
            Deployed += Aufzeichnungen(0).SpielerAufzeichnungen(Spieler - 1, 0).Einheiten
        End If
        If Deployed > 0 Then
            TechScore2 = (1 - (LostUnits(Spieler - 1) / Deployed)) * 1.1
        Else
            TechScore2 = 1.3
        End If
        If TechScore2 > 1.3 Then TechScore2 = 1.3
        'You get less points if you produce to much Units
        If DeployedUnits(Spieler - 1) > 0 Then
            TechScore3 = Truppenlimit / DeployedUnits(Spieler - 1)
        Else
            TechScore3 = 2
        End If
        If TechScore3 > 1.3 Then TechScore3 = 1.3
        PunkteVerteilung.Z = TechScore1 * TechScore2 * TechScore3 * 100
        If PunkteVerteilung.Z < 0 Then PunkteVerteilung.Z = 0
        Punkte = PunkteVerteilung.X + PunkteVerteilung.Y + PunkteVerteilung.Z
        'Rang auswaehlen
        Return GetRank(Punkte)
    End Function
    Public Shared Function GetRank(ByVal Punkte As Integer) As Rang
        Select Case Punkte
            Case Is >= 330
                Return Rang.S
            Case Is >= 280
                Return Rang.A
            Case Is >= 250
                Return Rang.B
            Case Is >= 200
                Return Rang.C
            Case Else
                Return Rang.D
        End Select
    End Function
    Public Sub UpdateAngriff(ByVal Damage As Integer, ByVal Spieler As Integer)
        AttackNumbers(Spieler - 1) += 1
        Me.Damage(Spieler - 1) += Damage
    End Sub

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim Klon As ObjektAufzeichnungen = MyBase.MemberwiseClone
        ReDim Klon.DeployedUnits(DeployedUnits.Length - 1)
        ReDim Klon.AttackNumbers(AttackNumbers.Length - 1)
        ReDim Klon.Damage(Damage.Length - 1)
        ReDim Klon.LostUnits(LostUnits.Length - 1)
        ReDim Klon.DestroyedUnits(DestroyedUnits.Length - 1)
        For I = 0 To Klon.DeployedUnits.Length - 1
            Klon.DeployedUnits(I) = DeployedUnits(I)
            Klon.AttackNumbers(I) = AttackNumbers(I)
            Klon.Damage(I) = Damage(I)
            Klon.LostUnits(I) = LostUnits(I)
            Klon.DestroyedUnits(I) = DestroyedUnits(I)
        Next
        ReDim Klon.BesondereEreignisse(BesondereEreignisse.Length - 1)
        For I = 0 To Klon.BesondereEreignisse.Length - 1
            Klon.BesondereEreignisse(I) = BesondereEreignisse(I).Clone
        Next
        ReDim Klon.Aufzeichnungen(Aufzeichnungen.Length - 1)
        For I = 0 To Klon.Aufzeichnungen.Length - 1
            Klon.Aufzeichnungen(I) = Aufzeichnungen(I).Clone
        Next
        Return Klon
    End Function

    Public Sub Read(ByRef StrR As Filestream, ByVal Spieler As Integer)
        Dim V As Byte = StrR.ReadByte
        Dim V2 As Byte = StrR.ReadByte
        ReDim Aufzeichnungen(-1)
        Dim Ende() As Byte = {0, 0, 0, 0}
        While Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254)
            Ende(0) = StrR.ReadByte
            Ende(1) = StrR.ReadByte
            Ende(2) = StrR.ReadByte
            Ende(3) = StrR.ReadByte
            StrR.Seek(-4)
            If Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254) Then
                Array.Resize(Aufzeichnungen, Aufzeichnungen.Length + 1)
                Aufzeichnungen(Aufzeichnungen.Length - 1) = New TagAufzeichnung()
                Aufzeichnungen(Aufzeichnungen.Length - 1).Read(StrR, Spieler, V2)
            End If
        End While
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        Ende = New Byte() {0, 0, 0, 0}
        While Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254)
            Ende(0) = StrR.ReadByte
            Ende(1) = StrR.ReadByte
            Ende(2) = StrR.ReadByte
            Ende(3) = StrR.ReadByte
            StrR.Seek(-4)
            If Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254) Then
                Array.Resize(BesondereEreignisse, BesondereEreignisse.Length + 1)
                BesondereEreignisse(BesondereEreignisse.Length - 1) = New BesonderesEreigniss(0, 0, BesonderesEreigniss.Ereignisse.Gabe)
                BesondereEreignisse(BesondereEreignisse.Length - 1).Read(StrR)
            End If
        End While
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        DestroyedUnits = ReadUInteger64Array(StrR)
        LostUnits = ReadUInteger64Array(StrR)
        Damage = ReadUInteger64Array(StrR)
        AttackNumbers = ReadUInteger64Array(StrR)
        DeployedUnits = ReadUInteger64Array(StrR)
    End Sub
    Public Sub Write(ByRef StrW As Filestream)
        StrW.WriteByte(Version)
        StrW.WriteByte(TagAufzeichnung.Version)
        For I = 0 To Aufzeichnungen.Length - 1
            Aufzeichnungen(I).Write(StrW)
        Next
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        For I = 0 To BesondereEreignisse.Length - 1
            BesondereEreignisse(I).Write(StrW)
        Next
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        WriteUInteger64Array(StrW, DestroyedUnits)
        WriteUInteger64Array(StrW, LostUnits)
        WriteUInteger64Array(StrW, Damage)
        WriteUInteger64Array(StrW, AttackNumbers)
        WriteUInteger64Array(StrW, DeployedUnits)
    End Sub
End Class
''' <summary>
''' Die Aufzeichnungen einer Runde
''' </summary>
''' <remarks></remarks>
Public Class TagAufzeichnung
    Implements ICloneable
    Public Const Version As Byte = 0
    Public SpielerAufzeichnungen As Aufzeichnung(,) = {}
    Public Sub New()
        If Objektverwalter.Spielfeld IsNot Nothing Then
            ReDim SpielerAufzeichnungen(Objektverwalter.Spielfeld.Spieler.Length - 2, 1)
            For I = 0 To SpielerAufzeichnungen.GetLength(0) - 1
                For I2 = 0 To 1 'Forces all Data to be set to Defeated. (some stuff is not updated by defeated players)
                    SpielerAufzeichnungen(I, I2) = New Aufzeichnung(Objektverwalter.Spielfeld.Runde, I + 1, -1, -1, -1, -1, -1)
                Next
            Next
        End If
    End Sub
    ''' <summary>
    ''' Macht ein Update der Aufzeichnung
    ''' </summary>
    ''' <param name="RundenAnfang"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function UpdateAufzeichnungen(ByVal RundenAnfang As Boolean) As Boolean
        Dim Stelle As Integer = 0
        If RundenAnfang = False Then Stelle = 1
        Dim Spieler As Integer = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
        SpielerAufzeichnungen(Spieler - 1, Stelle) = New Aufzeichnung(Objektverwalter.Spielfeld.Runde, Spieler, Objektverwalter.Spielfeld.AktuellerSpieler.Fonds, _
                                                               Objektverwalter.Spielfeld.AktuellerSpieler.Einkommen, Objektverwalter.Spielfeld.AktuellerSpieler.CountBuildings, Objektverwalter.Spielfeld.AktuellerSpieler.CountUnits, _
                                                               Objektverwalter.Spielfeld.AktuellerSpieler.CalculateSpielerStaerke)
        If Objektverwalter.Spielfeld.Runde = 1 Then
            If Spieler > 1 Then
                If SpielerAufzeichnungen(0, 0) Is Nothing Then
                    'Der Startspieler ist nicht Spieler 1 
                    For I = 0 To Spieler - 2
                        SpielerAufzeichnungen(I, 0) = New Aufzeichnung(Objektverwalter.Spielfeld.Runde, I + 1, Objektverwalter.Spielfeld.Spieler(I + 1).Fonds, _
                                                                  Objektverwalter.Spielfeld.Spieler(I + 1).Einkommen, Objektverwalter.Spielfeld.Spieler(I + 1).CountBuildings, Objektverwalter.Spielfeld.Spieler(I + 1).CountUnits, _
                                                                  Objektverwalter.Spielfeld.Spieler(I + 1).CalculateSpielerStaerke)
                        SpielerAufzeichnungen(I, 1) = New Aufzeichnung(Objektverwalter.Spielfeld.Runde, I + 1, Objektverwalter.Spielfeld.Spieler(I + 1).Fonds, _
                                                         Objektverwalter.Spielfeld.Spieler(I + 1).Einkommen, Objektverwalter.Spielfeld.Spieler(I + 1).CountBuildings, Objektverwalter.Spielfeld.Spieler(I + 1).CountUnits, _
                                                         Objektverwalter.Spielfeld.Spieler(I + 1).CalculateSpielerStaerke)

                    Next
                End If
            End If
        End If

        If RundenAnfang = False Then
            If Spieler = Objektverwalter.Spielfeld.Spieler.Length - 1 Then
                Return True
            End If
        End If
        Return False
    End Function

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim Klon As TagAufzeichnung = MyBase.MemberwiseClone
        ReDim Klon.SpielerAufzeichnungen(SpielerAufzeichnungen.GetLength(0) - 1, SpielerAufzeichnungen.GetLength(1) - 1)
        For I = 0 To Klon.SpielerAufzeichnungen.GetLength(0) - 1
            For I2 = 0 To Klon.SpielerAufzeichnungen.GetLength(1) - 1
                If SpielerAufzeichnungen(I, I2) IsNot Nothing Then
                    Klon.SpielerAufzeichnungen(I, I2) = SpielerAufzeichnungen(I, I2).Clone
                End If
            Next
        Next
        Return Klon
    End Function

    Public Sub Read(ByRef StrR As Filestream, ByVal Spieler As Integer, ByVal Version As Byte)
        Dim Ende() As Byte = {0, 0, 0, 0}
        ReDim SpielerAufzeichnungen(Spieler - 1, 1)
        For I = 1 To Spieler
            Dim Auf1 As New Aufzeichnung(0, 0, 0, 0, 0, 0, 0)
            Dim Auf2 As New Aufzeichnung(0, 0, 0, 0, 0, 0, 0)
            If StrR.ReadByte = 1 Then
                Auf1.Read(StrR, Version)
            Else
                Auf1 = Nothing
            End If
            If StrR.ReadByte = 1 Then
                Auf2.Read(StrR, Version)
            Else
                Auf2 = Nothing
            End If
            SpielerAufzeichnungen(I - 1, 0) = Auf1
            SpielerAufzeichnungen(I - 1, 1) = Auf2
        Next
    End Sub
    Public Sub Write(ByRef StrW As Filestream)
        For I = 0 To SpielerAufzeichnungen.GetLength(0) - 1
            If SpielerAufzeichnungen(I, 0) IsNot Nothing Then
                StrW.WriteByte(1)
                SpielerAufzeichnungen(I, 0).Write(StrW)
            Else
                StrW.WriteByte(0)
            End If
            If SpielerAufzeichnungen(I, 1) IsNot Nothing Then
                StrW.WriteByte(1)
                SpielerAufzeichnungen(I, 1).Write(StrW)
            Else
                StrW.WriteByte(0)
            End If

        Next
    End Sub
End Class
''' <summary>
''' Eine Aufzeichnung von einem Tag von einem Spieler.
''' </summary>
''' <remarks></remarks>
Public Class Aufzeichnung
    Implements ICloneable
    ''' <summary>
    ''' Der Tag der Aufzeichnung
    ''' </summary>
    ''' <remarks></remarks>
    Public Tag As Integer = 0
    ''' <summary>
    ''' Der Spieler von dem die Aufzeichnung ist.
    ''' </summary>
    ''' <remarks></remarks>
    Public Spieler As Integer = 0
    ''' <summary>
    ''' Das Geld, welches er hat.
    ''' </summary>
    ''' <remarks></remarks>
    Public Fonds As Integer = 0
    ''' <summary>
    ''' Sein Einkommen
    ''' </summary>
    ''' <remarks></remarks>
    Public Einkommen As Integer = 0
    ''' <summary>
    ''' Die Gebaeude die er hat.
    ''' </summary>
    ''' <remarks></remarks>
    Public Basen As Integer = 0
    ''' <summary>
    ''' Die Truppen unter seiner Kontrolle
    ''' </summary>
    ''' <remarks></remarks>
    Public Einheiten As Integer = 0
    ''' <summary>
    ''' Die Staerke dieses Spielers in Punkten.
    ''' </summary>
    ''' <remarks></remarks>
    Public SpielerStaerke As Integer = 0
    Public Sub New(ByVal Tag As Integer, ByVal Spieler As Integer, ByVal Fonds As Integer, ByVal Einkommen As Integer, ByVal Basen As Integer _
                   , ByVal Einheiten As Integer, ByVal Spielerstaerke As Integer)

        Me.Tag = Tag
        Me.Spieler = Spieler
        If Objektverwalter.Spielfeld IsNot Nothing Then
            If Objektverwalter.Spielfeld.Regeln.IstBesiegt(Spieler) Then
                Me.Fonds = -1
                Me.Einkommen = -1
                Me.Einheiten = -1
                Me.SpielerStaerke = -1
                Me.Basen = -1
            Else
                Me.Fonds = Fonds
                Me.Einkommen = Einkommen
                Me.Einheiten = Einheiten
                Me.Basen = Basen
                Me.SpielerStaerke = Spielerstaerke
            End If
        Else'I ask my self how you can get here.
            Me.Fonds = -1
            Me.Einkommen = -1
            Me.Einheiten = -1
            Me.SpielerStaerke = -1
            Me.Basen = -1
        End If
    End Sub
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return MyBase.MemberwiseClone
    End Function

    Public Sub Write(ByRef StrW As Filestream)
        Dim B(3) As Byte
        B = IntToBytes(Spieler)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(Tag)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next

        B = IntToBytes(Fonds)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(Einkommen)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(Basen)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(Einheiten)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(SpielerStaerke)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
    End Sub
    Public Sub Read(ByRef StrR As Filestream, ByVal Version As Byte)
        Dim B(3) As Byte
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Spieler = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Tag = BytesToInt(B)

        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Fonds = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Einkommen = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Basen = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Einheiten = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        SpielerStaerke = BytesToInt(B)
    End Sub
End Class
''' <summary>
''' Zeichnet ein besonderes Ereignis auf.
''' </summary>
''' <remarks></remarks>
Public Class BesonderesEreigniss
    Implements ICloneable
    Enum Ereignisse
        Gabe
        Spezialgabe
        Doppelgabe
        HQEroberung
        HQVerlust

    End Enum
    Public Spieler As Integer
    Public Tag As Integer
    Public Ereignis As Ereignisse
    Public Sub New(ByVal Spieler As Integer, ByVal Tag As Integer, ByVal Ereignis As Ereignisse)
        Me.Spieler = Spieler
        Me.Tag = Tag
        Me.Ereignis = Ereignis
    End Sub

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return MyBase.MemberwiseClone
    End Function

    Public Sub Write(ByRef StrW As Filestream)
        Dim B(3) As Byte
        B = IntToBytes(Spieler)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(Tag)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        StrW.WriteByte(Ereignis)
    End Sub
    Public Sub Read(ByRef StrR As Filestream)
        Dim B(3) As Byte
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Spieler = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Tag = BytesToInt(B)
        Ereignis = StrR.ReadByte
    End Sub
End Class